using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using App.Modelo;
using App.Modelo.Interfaces;
using App.Persistencia;
using NHibernate;


namespace App.Controlador
{
    public class ControladoraPerfiles  : ControladoraBase
    {
        
        /**
         * <summary>
         * Le da al grupo permiso a todos las funcinones de todos los 
         * formularios
         * </summary>
         */
        public void GrantAll(Grupo grupo)
        {
            var forms = Repositorio.GetAll<Formulario>();
            var funciones = Repositorio.GetAll<Funcion>();

            var perfiles = Get(grupo);

            foreach (Perfil p in perfiles)
                bajaPerfil(p);

            foreach (Formulario f in forms)
                foreach (Funcion g in funciones)
                    altaPerfil(new Perfil(grupo, g, f));
        }


        /**
         * Retorna todos los perfiles del grupo
         */
        public IList<Perfil> Get(Grupo grupo)
        {
            var param = new Dictionary<string, object>();
            param["Grupo"] = grupo.Id;

            return Repositorio.GetList<Perfil>(
                "FROM Perfil p WHERE p.Grupo.Id = :Grupo", param
            );
        }

        /** 
         * Retorna todos los perfiles del usuario y el formulario
         
        public IList<Perfil> Get(Usuario usuario, INombreFormularioSeguridad form)
        {
            string NombreFormularioSeguridad = form.NombreFormularioSeguridad;
            Grupo grupo = usuario.Grupo;

            if (grupo == null)
                throw new Exception("El usuario tiene que pertenecer a un grupo");

            IDictionary<string, object> par = new Dictionary<string, object>();

            // obtengo el formulario
            Formulario Form = Repositorio.Get<Formulario>("Nombre", NombreFormularioSeguridad);

            if (Form == null)
                throw new Exception(
                    "El formulario no esta registrado. Formulario: "
                    + NombreFormularioSeguridad 
                );

            
            par.Add("grupo", grupo);
            par.Add("form", Form);
            
            return Repositorio.GetList<Perfil>(
                @"FROM Perfil AS p 
                  WHERE p.Formulario = :form 
                    AND p.Grupo = :grupo", par);
        }
        */
        public void altaPerfil(Perfil p)
        {
            Repositorio.SaveObject(p);
        }

        public void bajaPerfil(Perfil p)
        {
            Repositorio.DeleteObject(p);
        }

        public Perfil ParsePerfil(string p)
        {
            string[] formFunc = p.Split('/');
            var perfil = new Perfil();
            if (formFunc.Length > 1)
            {
                perfil.Formulario = Repositorio.Get<Formulario>("Nombre", formFunc[0]);
                perfil.Funcion = Repositorio.Get<Funcion>("Nombre", formFunc[1]);
            }
            else if (formFunc.Length == 1)
            {
                perfil.Funcion = Repositorio.Get<Funcion>("Nombre", formFunc[0]);
            }
            return perfil;
        }

        public IList<Perfil> Get(Usuario us)
        {
            var Usuario = Repositorio.Get<Usuario>("Id", us.Id);

            var perfiles = new List<Perfil>();

            foreach (var grupo in Usuario.Grupos)
            {
                var param = new Dictionary<string, object>();
                param["Grupo"] = grupo.Id;
                
                var gp = Repositorio.GetList<Perfil>(
                    "FROM Perfil p WHERE p.Grupo.Id = :Grupo", param
                );

                perfiles.AddRange(gp);
            }

            return perfiles.Distinct().ToList();
        }
    }
}